package com.sky.service.admin.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.PasswordConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.dto.PasswordEditDTO;
import com.sky.exception.AccountLockedException;
import com.sky.exception.AccountNotFoundException;
import com.sky.exception.EmployeeNameExistException;
import com.sky.exception.PasswordErrorException;
import com.sky.mapper.admin.EmployeeMapper;
import com.sky.pojo.Employee;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.admin.EmployeeService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

@Service
public class EmployeeServiceImpl  implements EmployeeService {

    @Resource
    private EmployeeMapper employeeMapper;

    /**
     * 员工登录
     *
     * @param employeeLoginDTO
     * @return
     */
    public Employee login(EmployeeLoginDTO employeeLoginDTO) {
        String username = employeeLoginDTO.getUsername();
        String password = employeeLoginDTO.getPassword();//

        //1、根据用户名查询数据库中的数据  select * from employee where username = #{username}
        Employee employee = employeeMapper.getByUsername(username); //

        //2、处理各种异常情况（用户名不存在、密码不对、账号被锁定）
        if (employee == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        //密码比对
        // TODO 登录密码后期需要进行md5加密（DigestUtil），然后再进行比对
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        if (!password.equals(employee.getPassword())) {
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        if (employee.getStatus() == StatusConstant.DISABLE) {
            //账号被锁定
            throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
        }
        //3、返回实体对象
        return employee;
    }

    /**
     * 员工新增
     * @param dto
     * @return
     */
    @Override
    public Result<String> save(EmployeeDTO dto) {

        // TODO 有个业务性问题：录入用户名已存在的用户，抛出异常未处理。
        // 完善业务的健壮性
        //判断用户名是否存在
        Employee name = employeeMapper.getByUsername(dto.getUsername());
        if (name!=null){
            throw new EmployeeNameExistException("用户【"+dto.getName()+"】已存在!");
        }
        //1.创建一个employee实例对象
        Employee employee = new Employee();

        //2.将dto数据赋值到employee对象中
        // TODO 使用BeanUtils工具类进行属性值赋值
        BeanUtils.copyProperties(dto,employee);

        //3.初始化employee对象的其他属性
        //  密码初始化，需要加密
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes(StandardCharsets.UTF_8)));
        //  状态初始化
        employee.setStatus(1);
        //  创建时间初始化
        employee.setCreateTime(LocalDateTime.now());
        //  更新时间初始化
        employee.setUpdateTime(LocalDateTime.now());

        // TODO 新增员工时,创建人id和修改人id设置固定值。是登录该系统的人的id。需要使用ThreadLocal
        /**
         *  TODO 如何取到登录系统的id： 登录系统id在token里面会有。则可以在拦截器里面获取到token。
         *                           通过setCurrentId()在拦截器里把token里id存入到BaseContext中
         *                           在业务层使用getCurrentId()获取id
         */
        //获取登陆人id
        Long loginCurrentId = BaseContext.getCurrentId();
        //  创建者初始化
        employee.setCreateUser(loginCurrentId);
        //  更新者初始化
        employee.setUpdateUser(loginCurrentId);

        //4.调用mapper层方法向数据库插入数据
        employeeMapper.insert(employee);

        return Result.success();
    }

    /**
     * 分页查询员工列表
     * @param queryDto
     * @return
     */
    @Override
    public PageResult page(EmployeePageQueryDTO queryDto) {
        //1.mybatis分页插件
        PageHelper.startPage(queryDto.getPage(),queryDto.getPageSize());

        //2.调用mapper层获取查询后的数据
        Page<Employee> empList=  employeeMapper.pageQuery(queryDto.getName());
        //3.封装成PageResult对象
        PageResult pageResult = new PageResult();
        pageResult.setTotal(empList.getTotal());
        pageResult.setRecords(empList.getResult());
        //4. 返回结果
        return pageResult;
    }

    /**
     * 员工账号编辑
     * @param status
     * @param id
     * @return
     */
    @Override
    public Result<String> editStatus(Integer status, Long id) {
        employeeMapper.editStatus(status,id);
        return Result.success();
    }


}
